package cn.com.algorithm.sort;

import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.Stopwatch;

/**
 * 比较排序算法
 */
public class SortCompare {

    /**
     * 计算排序时间
     * @param alg
     * @param a
     * @return
     */
    public static double time(String alg, Double[] a) {
        Stopwatch timer = new Stopwatch();
        if (alg.equals("Insertion")) Insertion.sort(a);
        if (alg.equals("Selection")) Selection.sort(a);
        if (alg.equals("Shell")) Shell.sort(a);
//        if (alg.equals("Merge")) Merge.sort(a);
//        if (alg.equals("Quick")) Quick.sort(a);
//        if (alg.equals("Heap")) Heap.sort(a);
        return timer.elapsedTime();
    }

    /**
     * 随机生成T个长度为N的数组，排序计算总时间
     * @param alg
     * @param N
     * @param T
     * @return
     */
    public static double timeRandomInput(String alg, int N, int T) { // 使用算法1将T个长度为N的数组排序
        double total = 0.0;
        Double[] a = new Double[N];
        for (int t = 0; t < T; t++) { // 进行一次测试（ 生成一个数组并排序)
            for (int i = 0; i < N; i++)
                a[i] = StdRandom.uniform();
            total += time(alg, a);
        }
        return total;
    }

    /**
     * 输入 算法1，算法2，N，T
     * @param args
     */
    public static void main(String[] args) {
        String alg1 = args[0];
        String alg2 = args[1];
        int N = Integer.parseInt(args[2]);
        int T = Integer.parseInt(args[3]);
        double t1 = timeRandomInput(alg1, N, T); // 算法1的总时间
        double t2 = timeRandomInput(alg2, N, T); // 算法2的总时间
        System.out.println(t1);
        System.out.println(t2);
        StdOut.printf("For %d random Doubles\n %s is" , N, alg1);
        StdOut.printf(" %.1f times faster than %s\n" ,t2 / t1, alg2);
        // args = Insertion Selection 1000 100
        // For 1000 random Doubles
        // Insertion is 1.1 times faster than Selection

        // args = Shell Insertion 1000 100
        //For 1000 random Doubles
        //Shell is 7.5 times faster than Insertion
    }
}